﻿package scrn;


import media.*;

import mess.*;
import core.*;


// ======================================================== Экран выбора смайлов
public final class ScrSmile implements Win {

// ================================================================== Переменные
private int space = 2; // Дополнительное пространство
private int tdW; // Ширина ячейки
private int tdH; // Высота ячейки
private int cTot; // Кол-во колонок
private int rTot; // Кол-во строк
private int tdTot; // Кол-во ячеек

private int selSml; // Выбранный смайл
public String selSmlText; // Текст выбранного смайла

private int dX; // Текущее смещение по горизонтали
private int dY; // Текущее смещение по горизонтали

private int[] smX; // Координаты смайлов от верхнего левого угла поля
private int[] smY;

// Фон
private Image bg; // Картинка фона
private int scrBg1 = 0xb0d0ff; // Цвет фона экрана 1
private int scrBg2 = 0xffffff; // Цвет фона экрана 2

private int lineSel = 0x000000; //Цвет линий выделенного сообщения
private int bgSel = 0xd0ffd0; //Цвет фона выделенного сообщения

// Перемещение поля
private double movX; // Смещение по оси X в точках при перемещении селектора
private double movY; // Смещение по оси Y в точках при перемещении селектора

public Win winOld; // Ссылка на предыдущее окно

// =============================================================== Инициализация
public ScrSmile() {

	Mess.m("ScrSmile.init", "=====");

	init();
}


// ========================================== Получено событие изменения статуса
public boolean chStat(String statText) {

	return false;

}


// =========================================== Освободить ресурсы и закрыть окно
public void close(int from) {

	if (from <= Mess.LOCAL) {
		Man.scrMan.retWin(winOld);
	}
}


// ====================================================== Задать выбранный смайл
public void comSet() {

	if (selSml < Man.resMan.sms.length) {
		this.selSmlText = Man.resMan.sms[selSml].alt;
	} else {
		selSmlText = null;
	}
}


// =========================================== Отрисовать фон выделенного смайла 
public void drawSelBg(int selRow, int selCol) {

	// Прямоугольник
	Draw.g.setColor(this.bgSel);
	int rowX = dX + selRow * tdW;
	int rowY = dY + selCol * tdH;
	Draw.g.fillRect(rowX, rowY + 1, tdW + 1, tdH - 1);

	// Линии
	Draw.g.setColor(this.lineSel);
	Draw.g.drawLine(rowX, rowY, rowX + tdW, rowY);
	Draw.g.drawLine(rowX, rowY + tdH, rowX + tdW, rowY + tdH);
}


// ======================================================================= Выход
public void exit(int from) {

}


// ============================= Получено событие состояния "в сети / не в сети"
public void fOnline(boolean online) {

}


// ======================================================= Вернуть список команд
public boolean[] getComs() {

	return coms;
}


// ========================================================= Подготовка к работе
public void init() {

	// Размеры поля
	cTot = Draw.dispW / (Man.resMan.smlMaxW + space);

	tdW = Math.max(Draw.dispW / cTot, Man.resMan.smlMaxW + space);
	rTot = (Man.resMan.smsTot + cTot - 2) / cTot;
	tdH = Math.max(Man.resMan.smlMaxH + space, Draw.dispH / rTot);

	tdTot = rTot * cTot;

	Mess.m("ScrSmile.init", "Таблица " + cTot + "x" + rTot + ", ячейки " + tdW
			+ "x" + tdH);

	// Рассчет смайлов и отступов
	int x = 0; // Координаты текущей ячейки
	int y = 0;
	smX = new int[tdTot];
	smY = new int[tdTot];

	for (int q = 0; q < tdTot; ++q) {
		int smlNum = q + 1;
		Pic s;
		if (smlNum < Man.resMan.smsTot) {
			s = Man.resMan.sms[smlNum];
		} else {
			s = Man.resMan.sms[0];
		}

		smX[q] = ((tdW - s.w) >> 1) + x * tdW;
		smY[q] = ((tdH - s.h) >> 1) + y * tdH;
		if (++x >= cTot) {
			++y;
			x = 0;
		}

	}

	if (tdW * cTot > Draw.dispW) {
		movX = (Draw.dispW - tdW * cTot - 1) / (cTot - 1.);
	} else {
		movX = 0.;
	}

	if (tdH * rTot > Draw.dispH) {
		movY = (Draw.dispH - tdH * rTot - 1) / (rTot - 1.);
	} else {
		movY = 0;
	}

	// Картинка фона
	makeBg();
}


// ============================================= Извещение о пришедшем сообщении
public boolean inText(int contType, int contNum, Message message) {

	return false;
}


public boolean isGraphic() {

	return true;
}


// =============================================== Обработчик событий клавиатуры
public boolean keyPressed(int action) {

	boolean fFlush = false;

	switch (action) {
		case Canvas.UP:
			if ((selSml -= cTot) < 0) {
				selSml += cTot;
			}
			fFlush = true;
			break;

		case Canvas.DOWN:
			if ((selSml += cTot) >= tdTot) {
				selSml -= cTot;
			}
			fFlush = true;
			break;

		case Canvas.LEFT:
			if (selSml > 0) {
				selSml--;
			}
			fFlush = true;
			break;

		case Canvas.RIGHT:
			if (++selSml == tdTot) {
				selSml--;
			}
			fFlush = true;
			break;

		case Canvas.FIRE:
			comSet();
			close(Mess.LOCAL);
			break;

		case Canvas.GAME_A:
			break;

		case Canvas.GAME_B:
			break;

		case Canvas.GAME_C:
			break;

		case Canvas.GAME_D:
			break;
	}

	show(null);
	return fFlush;

}


public boolean keyState(int state) {

	boolean fFlush = false;

	if ((state & GameCanvas.UP_PRESSED) != 0) {
		if ((selSml -= cTot) < 0) {
			selSml += cTot;
		}
		fFlush = true;
	} else if ((state & GameCanvas.DOWN_PRESSED) != 0) {
		if ((selSml += cTot) >= tdTot) {
			selSml -= cTot;
		}
		fFlush = true;
	} else if ((state & GameCanvas.LEFT_PRESSED) != 0) {
		if (selSml > 0) {
			selSml--;
		}
		fFlush = true;
	} else if ((state & GameCanvas.RIGHT_PRESSED) != 0) {
		if (++selSml == tdTot) {
			selSml--;
		}
		fFlush = true;
	}

	show(null);
	return fFlush;
}


// =================================================== Создать всю картинку фона
private void makeBg() {

	try {
		if ((bg == null) || (bg.getWidth() != Draw.dispW)
				|| (bg.getHeight() != Draw.dispH)) { // Картинка фона еще не создана
			Mess.m("ScrSmile.makeBg", "Создаю картинки фона");

			bg = Image.createImage(Draw.dispW, Draw.dispH);

			Graphics g = bg.getGraphics();

			Draw.rectG(g, 0, 0, Draw.dispW, Draw.dispH >> 2, scrBg1, scrBg2);
			Draw.rectG(g, 0, Draw.dispH >> 2, Draw.dispW, Draw.dispH
					- (Draw.dispH >> 2), scrBg2, scrBg1);
		}

	} catch (Exception e) {
		Mess.err("ScrSmile.makeBg", "Не могу создать картинку фона", e);
	}
}


// ============================================================= Отрисовать окно
public void show(Win winOld) {

	if (winOld != null && winOld != this) {
		this.winOld = winOld;
	}

	if ((bg == null) || (bg.getWidth() != Draw.dispW)
			|| (bg.getHeight() != Draw.dispH)) { // Картинка фона еще не создана, или размер экрана изменился
		init();
	}

	synchronized (Man.main) {
		Draw.g.setClip(0, 0, Draw.dispW, Draw.dispH);
		Draw.g.drawImage(bg, 0, 0, Graphics.TOP | Graphics.LEFT);
		Draw.g.setColor(this.scrBg1);

		// Отрисовка смайлов
		int smTot = Man.resMan.smsTot - 1;
		int refX;
		int refY;

		int selRow = selSml % cTot; // Выбранная строка
		int selCol = selSml / cTot;

		dX = (int) (movX * selRow);
		dY = (int) (movY * selCol);

		// Линии сетки
		for (int q = 1; q < cTot; ++q) {
			refX = dX + q * tdW;
			Draw.g.drawLine(refX, 0, refX, Draw.dispH);
		}

		for (int q = 1; q < rTot; ++q) {
			refY = dY + q * tdH;
			Draw.g.drawLine(0, refY, Draw.dispW, refY);
		}

		Man.picAni.reset(bgSel, 0, 0, Draw.dispW, Draw.dispH, bg);

		drawSelBg(selRow, selCol);

		for (int q = 0; q < smTot; ++q) {
			refY = smY[q] + dY;
			if (refY > 0) { // Влазит сверху
				Pic sml = Man.resMan.sms[q + 1];
				if (refY - sml.h < Draw.dispH) { // Влазит снизу
					refX = smX[q] + dX;
					if (refX < Draw.dispW) { // Влазит справа
						if (refX + sml.w >= 0) { // Влазит слева

							if (q == selSml) { // Отрисовываем выделенный
								if (sml.fAni) { // Анимирован
									Man.picAni.addPic(q + 1, refX, refY, true);
								}
							}

							sml.draw(Draw.g, refX, refY);
						}
					}
				}
			}
		}
	}
}


// ====================================================== Тик системного таймера 
public boolean tick() {

	return Man.picAni.drawAll();
}


// ============================================================= Команды смайлов
public void command(Command command) {

	if (command == Man.scrMan.coms[ScrMan.COM_SML]) {
		comSet();
		close(Mess.LOCAL);
	}
}


}
